package com.monkey.algorithm.chapter2

/**
 * 作者：Monkey
 * 日期：2018/1/31
 */
abstract class BaseExample {
    /**
     * @param arr 需要排序的数组，默认按照升序排列
     * @return Void
     * @author Monkey
     * @date 2018/5/24
     */
    abstract fun <T> sort(arr: Array<Comparable<T>>)

    /**
     * @description 比较v和w的大小，返回 v < w
     * @param v 第一个值
     * @param w 第二个值
     * @return v < w
     * @author Monkey
     * @date 2018/5/24
     */
    protected fun <T> less(v: Comparable<T>, w: Comparable<T>): Boolean {
        return v < w as T
    }

    /**
     * @description 交换arr中索引为i和j的元素的位置
     * @param arr 数据源
     * @param i 索引1
     * @param j 索引2
     * @return Void
     * @author Monkey
     * @date 2018/5/24
     */
    protected fun <T> swap(arr: Array<T>, i: Int, j: Int) {
        val temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
    }

    /**
     * 打印当前集合元素
     */
    fun show(arr: Array<*>) {
        for (item in arr) {
            print("$item ")
        }
        println()
    }

    /**
     * 判断集合是否已经排序
     */
    fun <T> isSorted(arr: Array<Comparable<T>>): Boolean {
        return (1 until arr.size).none { less(arr[it], arr[it - 1]) }
    }
}